// Object.defineProperty

// var obj = {
//   a: 1,
//   b: 2
// }

// Object.defineProperty(obj, 'c', {
//   get() {
//     return 3
//   },
//   set(val) {
//     return val
//   },
//   enumerable: true, // 默认 false
//   configurable: false
// })

// for(let i in obj){
//   console.log(obj[i])
// }

// Proxy

// get
// let numbers = [0, 1, 2];

// numbers = new Proxy(numbers, {
//   get(target, prop) {
//     if (prop in target) {
//       return target[prop];
//     } else {
//       return 0; // 默认值
//     }
//   }
// });

// console.log( numbers[1] ); // 1
// console.log( numbers[123] ); // 0 (没有这样的元素)

// set
// let numbers = []
// numbers = new Proxy(numbers, {
//   set(target, prop, value) {
//     if (typeof value == 'number') {
//       target[prop] = value
//       return true
//     }
//     return false
//   }
// })
// numbers.push(1)
// numbers.push(1)
// numbers.push(1)
// console.log(numbers)
// numbers.push('1') // error

// ownKeys
let user = {
  name:"John",
  age:30,
  _password:"***"
}
user = new Proxy(user,{
  ownKeys(target){
    return Object.keys(target).filter(key => key.split("")[0] !== "_")
  }
})
// "ownKeys" 过滤掉 _password
for(let key in user) console.log(key); // name，然后是 age

// 对这些方法同样有效：
console.log( Object.keys(user) ); // name,age
console.log( Object.values(user) ); // John,30